package scream.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import scream.excepcion.DAOExcepcion;
import scream.modelo.Bastanteo;
import scream.modelo.Bastanteo_Detalle;
import scream.modelo.Cliente;
import scream.modelo.Grupo;
import scream.modelo.Poder;
import scream.modelo.TipoIntervencion;
import scream.modelo.TipoProductoServicio;
import scream.util.ConexionBD;
import scream.dao.BaseDAO;

public class BastanteoDAO extends BaseDAO {

	public void insertar_Detalle(Bastanteo_Detalle bastanteo_d)
			throws DAOExcepcion {

		System.out
				.println("BastanteoDAO: insertar_Detalle(Bastanteo_Detalle bastanteo_d)");
		String query = "INSERT INTO bastanteo_detalle(coGrupo,co_Bastanteo,nuImporte,feFechaVencimiento,CoTipoIntervencion,coPoder) VALUES (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, bastanteo_d.getGrupo().getCoGrupo());
			stmt.setInt(2, bastanteo_d.getBastanteo().getCoBastanteo());
			stmt.setDouble(3, bastanteo_d.getNuImporte());
			stmt.setString(4, bastanteo_d.getFeFechaVencimiento());
			stmt.setString(5, bastanteo_d.getTipoIntervencion()
					.getCoTipoIntervencion());
			stmt.setString(6, bastanteo_d.getPoder().getCoPoder());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar el detalle");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	public void insertar(Bastanteo bastanteo) throws DAOExcepcion {

		System.out.println("BastanteoDAO: insertar(Bastanteo bastanteo)");
		String query = "INSERT INTO bastanteo(coBastanteo,coCliente) VALUES (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, bastanteo.getCoBastanteo());
			stmt.setString(2, bastanteo.getCliente().getCoCliente());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	// -------------------------------------------------------------------------------------------

	public void insertar_plus(Bastanteo bastanteo,
			Bastanteo_Detalle bastanteo_d, boolean nuevo,
			Collection<String> combinaciones) throws DAOExcepcion {

		System.out.println("BastanteoDAO: insertar(Bastanteo bastanteo)");
		String query = "INSERT INTO bastanteo(coBastanteo,coCliente) VALUES (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;

		try {

			con = ConexionBD.obtenerConexion();

			// si es nuevo grabamos la cabecera
			// sino solo el detalle y la combinacion
			if (nuevo) {
				stmt = con.prepareStatement(query);
				stmt.setInt(1, bastanteo.getCoBastanteo());
				stmt.setString(2, bastanteo.getCliente().getCoCliente());

				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo insertar la cabecera");
				}
			}

			// grabamos el detalle del Bastanteo
			query = "INSERT INTO bastanteodetalle(coGrupo,coBastanteo,nuImporte,feVencimiento,coTipoIntervencion,coPoder,item) VALUES (?,?,?,?,?,?,?)";
			stmt = null;

			stmt = con.prepareStatement(query);
			stmt.setString(1, bastanteo_d.getGrupo().getCoGrupo());
			stmt.setInt(2, bastanteo_d.getBastanteo().getCoBastanteo());
			stmt.setDouble(3, bastanteo_d.getNuImporte());
			stmt.setString(4, bastanteo_d.getFeFechaVencimiento());
			stmt.setString(5, bastanteo_d.getTipoIntervencion()
					.getCoTipoIntervencion());
			stmt.setString(6, bastanteo_d.getPoder().getCoPoder());
			stmt.setInt(7, bastanteo_d.getItem());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar el detalle");
			}

			// grabamos los datos de la combinacion

			for (String c : combinaciones) {
				System.out.print("agrego combi " + c);

				Insertar_combinacion(bastanteo_d.getBastanteo()
						.getCoBastanteo(), bastanteo_d.getItem(), c);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	private void Insertar_combinacion(int cod_Bas, int item, String cod_Grupo)
			throws DAOExcepcion {
		System.out.println("BastanteoDAO: Insertar_combinacion('','','')");
		String query = "INSERT INTO combinacion(coBastanteo,item,coGrupo) VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cod_Bas);
			stmt.setInt(2, item);
			stmt.setString(3, cod_Grupo);

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en la combinacion");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	public boolean repite_poder(int cod_bas, String cod_cli, String cod_gru,
			String cod_poder, String cod_Intervencion) throws DAOExcepcion {
		boolean respuesta = false;

		System.out
				.println("BastanteoDAO: repite_poder(String tipo,String numero)");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			String query = "select * from bastanteo a inner join bastanteodetalle b "
					+ "on a.coBastanteo = b.coBastanteo "
					+ "where a.coBastanteo = ? "
					+ "and a.coCliente = ? "
					+ "and b.coGrupo = ? "
					+ "and b.coPoder = ? "
					+ "and b.coTipoIntervencion = ?";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cod_bas);
			stmt.setString(2, cod_cli);
			stmt.setString(3, cod_gru);
			stmt.setString(4, cod_poder);
			stmt.setString(5, cod_Intervencion);

			rs = stmt.executeQuery();
			if (rs.next()) {
				respuesta = true;
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;
	}

	public Collection<Poder> Listar_Poderes() throws DAOExcepcion {
		System.out.println("BastanteoDAO: Listar_Poderes()");
		Collection<Poder> c = new ArrayList<Poder>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();

			String query = "SELECT coPoder,noPoder,coTipoProductoServicio from Poder";

			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Poder vo = new Poder();
				TipoProductoServicio tps = new TipoProductoServicio();

				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs
						.getString("coTipoProductoServicio"));
				vo.setCoTipoProductoServicio(tps);

				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<Grupo> Listar_Grupos() throws DAOExcepcion {
		System.out.println("BastanteoDAO: Listar_Grupos()");
		Collection<Grupo> c = new ArrayList<Grupo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();

			String query = "SELECT coGrupo from Grupo";

			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Grupo g = new Grupo();

				g.setCoGrupo(rs.getString("coGrupo"));

				c.add(g);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Collection<Cliente> listar_clientes() throws DAOExcepcion {
		System.out.println("BastanteoDAO: listar_clientes()");
		Collection<Cliente> c = new ArrayList<Cliente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT coCliente,noRazonSocial,nuRuc  from Cliente";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente vo = new Cliente();
				vo.setCoCliente(rs.getString("coCliente"));
				vo.setNuRuc(rs.getString("nuRuc"));
				vo.setNoRazonSocial(rs.getString("noRazonSocial"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Cliente obtener_cliente_x_codigo(String coCliente)
			throws DAOExcepcion {
		System.out
				.println("BastanteoDAO: obtener_cliente_x_codigo(String coCliente)");
		Cliente vo = new Cliente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select coCliente, noRazonSocial,nuRuc"
					+ " from Cliente where coCliente=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, coCliente);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCoCliente(rs.getString(1));
				vo.setNoRazonSocial(rs.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	private int Obtener_Nuevo_Num_Bastanteo() throws DAOExcepcion {
		int respuesta = 0;
		System.out.println("BastanteoDAO: Obtener_Nuevo_Num_Bastanteo()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			String query = "select count(*) as numero from bastanteo";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			rs = stmt.executeQuery();
			if (rs.next()) {
				respuesta = rs.getInt("numero");
				respuesta = respuesta + 1;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;

	}

	public int Obtener_Num_Bastanteo_x_Cliente(String cod_cli)
			throws DAOExcepcion {
		int respuesta = 0;
		System.out.println("BastanteoDAO: Obtener_Num_Bastanteo_x_Cliente()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			String query = "select coBastanteo from bastanteo where cocliente = ?";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cod_cli);

			rs = stmt.executeQuery();
			if (rs.next()) {
				respuesta = rs.getInt("coBastanteo");
			} else {

				respuesta = Obtener_Nuevo_Num_Bastanteo();
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;

	}

	public boolean Cliente_tiene_Bastanteo(String cod_cli) throws DAOExcepcion {
		boolean respuesta = false;
		System.out.println("BastanteoDAO: Existe_en_Bastanteo(()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			String query = "select coBastanteo from bastanteo where cocliente = ?";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cod_cli);

			rs = stmt.executeQuery();
			if (rs.next()) {
				respuesta = true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;

	}

	public int Obtener_Num_Item_Bastanteo(int cod_Bas) throws DAOExcepcion {
		int respuesta = 0;
		System.out.println("BastanteoDAO: Obtener_Num_Item_Cliente()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			String query = "select isnull(max(item)) as valor from scream.bastanteodetalle where coBastanteo = ?";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cod_Bas);

			rs = stmt.executeQuery();
			if (rs.next()) {
				if (rs.getInt("valor") == 1) {
					respuesta = 1;
				} else {
					respuesta = Obtener_Num_Ult_Item_Bastanteo(cod_Bas);
				}
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;

	}

	private int Obtener_Num_Ult_Item_Bastanteo(int cod_Bas) throws DAOExcepcion {
		int respuesta = 0;
		System.out.println("BastanteoDAO: Obtener_Num_Ult_Item_Bastanteo()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		
		
		try {
			String query = "select max(item) as valor from scream.bastanteodetalle where coBastanteo = ?";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, cod_Bas);

			rs = stmt.executeQuery();
			if (rs.next()) {
				respuesta = rs.getInt("valor");
				respuesta = respuesta + 1;
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

		return respuesta;

	}

	public Collection<Bastanteo_Detalle> Listar_Bas_Det(int cod_basta)
			throws DAOExcepcion {
		Collection<Bastanteo_Detalle> detalle = new ArrayList<Bastanteo_Detalle>();

		System.out.println("BastanteoDAO: Listar_Bas_Det(int cod_basta)");

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			
			String query = "select a.*,p.noPoder,i.noTipoIntervencion from bastanteodetalle a  "
					+ "inner join Poder p on a.coPoder = p.coPoder "
					+ "inner join TipoIntervencion i on a.coTipoIntervencion=i.coTipoIntervencion "
					+ "where coBastanteo = ?  " + " order by item";

			stmt = con.prepareStatement(query);
			stmt.setInt(1, cod_basta);
			rs = stmt.executeQuery();
			

			Poder poder;
			Grupo grupo;
			TipoIntervencion tipoIntervencion;
			while (rs.next()) {
				Bastanteo_Detalle db = new Bastanteo_Detalle();
				poder = new Poder();
				poder.setCoPoder(rs.getString("coPoder"));
				poder.setNoPoder(rs.getString("noPoder"));

				grupo = new Grupo();
				grupo.setCoGrupo(rs.getString("coGrupo"));

				tipoIntervencion = new TipoIntervencion();
				tipoIntervencion.setCoTipoIntervencion(rs
						.getString("coTipoIntervencion"));
				tipoIntervencion.setNoTipoIntervencion(rs
						.getString("noTipoIntervencion"));

				db.setItem(rs.getInt("item"));
				db.setPoder(poder);
				db.setGrupo(grupo);
				db.setTipoIntervencion(tipoIntervencion);
				db.setNuImporte(rs.getDouble("nuImporte"));
				db.setFeFechaVencimiento(rs.getString("feVencimiento"));

				detalle.add(db);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
			System.out.print("numeor de detalles " + detalle.size());
		return detalle;
	}

}
